#include <stdio.h>
#include <string.h>

// 数据在内存中以二进制的形式存储，如果不加转换的输出到外存，就是二进制文件。 根据数据的组织形式，数据文件被称为文本文件或者二进制文件。
// 文本文件和二进制文件 如果要求在外存上以ASCII码的形式存储，则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
// 字符一律以ASCII形式存储，数值型数据既可以用ASCII形式存储，也可以使用二进制形式存储。
// 如有整数10000，如果以ASCII码的形式输出到磁盘，则磁盘中占用5个字节(每个字符一个字节)，而 二进制形式输出，则在磁盘上只占4个字节
// int main()
// {
//     int i = 10000;
//     // 二进制的形式写到文件中
//     FILE *pf = fopen("test.txt", "wb");
//     fwrite(&i, 4, 1, pf);
//     fclose(pf);
//     pf = NULL;
//     return 0;
// }

// 在文件读取过程中，不能用feof函数的返回值直接用来判断文件的是否结束。
// 而是应用于当文件读取结束的时候，判断是读取失败结束，还是遇到文件尾结束。
// 文本文件读取是否结束，判断返回值是否为 EOF ( fgetc )，或者 NULL ( fgets )
// 二进制文件的读取结束判断，判断返回值是否小于实际要读的个数。

// fread要求读取count个大小为size字节的数据，如果真读取到了count个，就返回count
// 读取不到count个数据，返回的是真实读取到的完整的数据个数

// 写一个代码完成文件的拷贝
// data1.txt--->data2.txt

// int main()
// {
//     FILE *pfread = fopen("data1.txt", "r");
//     if (pfread == NULL)
//     {
//         perror("fopen fail");
//         return 1;
//     }
//     FILE *pfwrite = fopen("data2.txt", "w");
//     if (pfwrite == NULL)
//     {
//         perror("fopen fail");
//         fclose(pfread);
//         pfread = NULL;
//         return 1;
//     }
//     // 拷贝数据
//     int ch = 0;
//     while ((ch = fgetc(pfread)) != EOF)
//     {
//         fputc(ch, pfwrite);
//     }
//     // 关闭文件
//     fclose(pfread);
//     pfread = NULL;
//     fclose(pfwrite);
//     pfwrite = NULL;
//     return 0;
// }

// ferror在文件读取结束后，用来判断文件会否因为读取过程中遇到错误而结束
// feof在文件读取结束后，用来判断文件是否因为读取过程中遇到文件结束标志而结束

// enum
// {
//     SIZE = 5
// };
// int main(void)
// {
//     double a[SIZE] = {1., 2., 3., 4., 5.};
//     FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式
//     fwrite(a, sizeof(*a), SIZE, fp);    // 写 double 的数组

//     fclose(fp);
//     double b[SIZE];
//     fp = fopen("test.bin", "rb");
//     size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组 fp = fopen("test.bin","rb");

//     if (ret_code == SIZE)
//     {
//         puts("Array read successfully, contents: ");
//         for (int n = 0; n < SIZE; ++n)
//         {
//             printf("%f ", b[n]);
//             putchar('\n');
//         }
//     }
//     else // error handling
//     {
//         if (feof(fp))
//             printf("Error reading test.bin: unexpected end of file\n");

//         else if (ferror(fp))
//         {
//             perror("Error reading test.bin");
//         }
//         fclose(fp);
//     }
// }

// 缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。
// 从内存向磁盘输出数据会先送到内存中的缓冲区，装满缓冲区后才一起送到磁盘上。
// 如果从磁盘向计算机读入数据，则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区)，然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
// 缓冲区的大小根 据C编译系统决定的。

// int main()
// {
//     int arr[10][10] = {0};
//     int i = 0;
//     int j = 0;
//     for (i = 0; i < 10; i++)
//     {
//         for (j = 0; j <= i; j++)
//         {
//             if (i == j || j == 0)
//             {
//                 arr[i][j] = 1;
//             }
//             if (i >= 2 && j >= 1)
//             {
//                 arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
//             }
//         }
//     }
//     for (i = 0; i < 10; i++)
//     {
//         for (int k = 0; k < 10 - 1 - i; k++)
//         {
//             printf(" ");
//         }
//         for (j = 0; j <= i; j++)
//         {
//             printf("%d ", arr[i][j]);
//         }
//         printf("\n");
//     }
//     return 0;
// }
void reverse(char *left, char *right)
{
    while (left < right)
    {
        char tmp = *right;
        *right = *left;
        *left = tmp;
        left++;
        right--;
    }
}
void left_move(char arr[], int k)
{
    size_t sz = strlen(arr);
    k %= sz;
    while (k--)
    {
        char tmp = *arr;
        for (int i = 0; i < sz - 1; i++)
        {
            arr[i] = arr[i + 1];
        }
        arr[sz - 1] = tmp;
    }
    // reverse(arr, arr + k - 1);
    // reverse(arr + k, arr + sz - 1);
    // reverse(arr, arr + sz - 1);
}
// int main()
// {
//     char arr[] = "ABCDEF";
//     int sz = strlen(arr);
//     left_move(arr, 1);
//     printf("%s", arr);
//     return 0;
// }

// int is_left_move(char *arr1, char *arr2)
// {
//     int len = strlen(arr1);
//     for (int j = 0; j < len; j++)
//     {

//         char tmp = *arr1;
//         for (int i = 0; i < len - 1; i++)
//         {
//             arr1[i] = arr1[i + 1];
//         }
//         arr1[len - 1] = tmp;
//         if (strcmp(arr1, arr2) == 0)
//         {
//             return 1;
//         }
//     }
//     return 0;
// }

int is_left_move(char *arr1, char *arr2)
{
    int len = strlen(arr1);
    int len2 = strlen(arr2);
    if (len != len2)
    {
        return 0;
    }
    strncat(arr1, arr1, len);
    if (strstr(arr1, arr2) == NULL)
    {
        return 0;
    }
    else
        return 1;
}

int main()
{
    char arr1[20] = "ABCDEF";
    char arr2[] = "CDEFAB";
    int ret = is_left_move(arr1, arr2);
    if (ret == 1)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}